package negocio;

import java.io.Serializable;

import java.util.Date;
import java.util.List;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
import javax.persistence.Table;

import beans.MozoVO;

import exceptions.MesaException;



@Entity
@Table(name="mozos")
public class Mozo implements Serializable  
{

	private static final long serialVersionUID = 1L;
	
	@Column(name="nombre", nullable=true)
	private String nombre;
	
	@Id
	@Column(name="id_dni", nullable=false)
	private int id_dni;
	
	
	@OneToOne(cascade=CascadeType.ALL)
	@JoinColumn(name="id_sector", referencedColumnName="id_sector")
	private Sector sector;
	
	@Column(name="porcentaje_Comision", nullable=true)
	private float porcentaje_Comision;
	
	
	public String getNombre() {
		return nombre;
	}
	public void setNombre(String nombre) {
		this.nombre = nombre;
	}
	public int getId_dni() {
		return id_dni;
	}
	public void setId_dni(int id_dni) {
		this.id_dni = id_dni;
	}
	public Sector getSector() {
		return sector;
	}
	public void setSector(Sector sector) {
		this.sector = sector;
	}
	public float getPorcentaje_Comision() {
		return porcentaje_Comision;
	}
	public void setPorcentaje_Comision(float porcentaje_Comision) {
		this.porcentaje_Comision = porcentaje_Comision;
	}
	
	public MozoVO getVO()
	{
		MozoVO mVO = new MozoVO();
		mVO.setId_dni(getId_dni());
		mVO.setNombre(getNombre());
		mVO.setPorcentaje_Comision(getPorcentaje_Comision());
		mVO.setSector(getSector().getVO());
		
		return mVO;
	}
	
	
	@Override
	public String toString() {
		return "Mozo [nombre=" + nombre + ", id_dni=" + id_dni + ", sector="
				+ sector + ", porcentaje_Comision=" + porcentaje_Comision + "]";
	}
	
	//hashcode and equals
	
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + id_dni;
		result = prime * result + ((nombre == null) ? 0 : nombre.hashCode());
		result = prime * result + Float.floatToIntBits(porcentaje_Comision);
		result = prime * result + ((sector == null) ? 0 : sector.hashCode());
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Mozo other = (Mozo) obj;
		if (id_dni != other.id_dni)
			return false;
		if (nombre == null) {
			if (other.nombre != null)
				return false;
		} else if (!nombre.equals(other.nombre))
			return false;
		if (Float.floatToIntBits(porcentaje_Comision) != Float
				.floatToIntBits(other.porcentaje_Comision))
			return false;
		if (sector == null) {
			if (other.sector != null)
				return false;
		} else if (!sector.equals(other.sector))
			return false;
		return true;
	}
	
	public Pedido generarPedido(Set<Plato> platos, Mesa mesa, 
			boolean isFacturable){
		Pedido pedido = new Pedido();
		pedido.setPlatos(platos);
		pedido.setEstado("Asignado");
		pedido.setFacturable(isFacturable);
		mesa.asignarPedido(pedido);
		return pedido;
	}
	
	public void abrirMesa(int numeroMesa, int cantPersonas, 
			Date fechaApertura) 
			throws MesaException 
	{
		sector.abrirMesa(numeroMesa, cantPersonas, fechaApertura);
	}
	
	public void unirMesas(List<Integer> nroMesas, 
			int maxCantPersonas) 
			throws MesaException
	{
		sector.unirMesas(nroMesas, maxCantPersonas);
	}
	
	public void cerrarMesa(int numeroMesa) throws MesaException
	{
		sector.cerrarMesa(numeroMesa);
	}
	
	public void liberarMesa(int numeroMesa) throws MesaException
	{
		sector.liberarMesa(numeroMesa);
	}
}